//+------------------------------------------------------------------+
//|               ChartObjectsElliott.mqh MQL5 艾略特波浪类头文件     |
//|                版权所有 2000-2025, MetaQuotes Ltd.              |
//|                        官方网址: https://www.mql5.com            |
//+------------------------------------------------------------------+
//| 包含所有艾略特波浪分析工具类（3浪修正浪、5浪推动浪）               |
//+------------------------------------------------------------------+
#include "ChartObject.h"  // 引入图表对象基类 CChartObject（提供通用属性与生命周期管理）

//+------------------------------------------------------------------+
//| CChartObjectElliottWave3 类（艾略特3浪修正浪对象）                |
//| 功能：MQL5 图表艾略特3浪修正浪工具，用于标记价格趋势中的3浪修正结构 |
//| 继承关系：public CChartObject（基于图表对象基类，扩展波浪特有属性）|
//| 核心特性：                                                      |
//|  1. 3点定义结构：通过3个锚点（起点、调整点、终点）确定3浪形态        |
//|  2. 浪级配置：支持设置波浪等级（如主要浪、次要浪），适配不同时间周期分析 |
//|  3. 线条控制：可开启/关闭浪形内部连接线，优化图表显示清晰度         |
//|  4. 继承通用属性：颜色、线型、可见周期、Z-Order 等                  |
//+------------------------------------------------------------------+
class CChartObjectElliottWave3 : public CChartObject
  {
public:
   /**
    * @brief 构造函数：初始化艾略特3浪修正浪对象
    * @details 调用父类 CChartObject 构造函数，初始化波浪对象的基础属性（未绑定图表）
    */
                     CChartObjectElliottWave3(void);

   /**
    * @brief 析构函数：销毁艾略特3浪修正浪对象
    * @details 依赖父类析构逻辑，自动删除图表上的波浪对象，释放资源
    */
                    ~CChartObjectElliottWave3(void);

   //--- 波浪特有属性接口（浪级、线条显示）
   /**
    * @brief 获取当前波浪的等级（浪级）
    * @return ENUM_ELLIOT_WAVE_DEGREE - 浪级枚举值（如 ELLIOT_WAVE_MAJOR 表示主要浪，ELLIOT_WAVE_MINOR 表示次要浪）
    * @note 浪级用于区分波浪在整体趋势中的层级，适配不同时间周期的分析（大周期用主要浪，小周期用次要浪）
    */
   ENUM_ELLIOT_WAVE_DEGREE Degree(void) const;

   /**
    * @brief 设置波浪的等级（浪级）
    * @param degree [in] 新浪级（需为 ENUM_ELLIOT_WAVE_DEGREE 枚举值）
    * @return bool - 操作结果：true 表示设置成功，false 表示失败（未绑定图表）
    */
   bool              Degree(const ENUM_ELLIOT_WAVE_DEGREE degree) const;

   /**
    * @brief 获取浪形内部连接线的显示状态
    * @return bool - 状态值：true=显示连接线（连接3个锚点，清晰展示浪形结构），false=隐藏连接线（仅显示浪形轮廓）
    */
   bool              Lines(void) const;

   /**
    * @brief 设置浪形内部连接线的显示状态
    * @param lines [in] 新状态（true=显示，false=隐藏）
    * @return bool - 操作结果：true 表示设置成功，false 表示失败（未绑定图表）
    */
   bool              Lines(const bool lines) const;

   //--- 3浪修正浪创建接口
   /**
    * @brief 在指定图表创建艾略特3浪修正浪对象（通过3个锚点定义）
    * @param chart_id [in] 目标图表 ID（0 表示当前图表，可通过 ChartID() 获取）
    * @param name [in] 波浪对象唯一名称（图表内不可重复）
    * @param window [in] 子窗口编号（0=主窗口，≥1=指标子窗口）
    * @param time1 [in] 第1个锚点的时间坐标（修正浪起点对应的 K 线时间）
    * @param price1 [in] 第1个锚点的价格坐标（修正浪起点价格）
    * @param time2 [in] 第2个锚点的时间坐标（修正浪调整点对应的 K 线时间）
    * @param price2 [in] 第2个锚点的价格坐标（修正浪调整点价格）
    * @param time3 [in] 第3个锚点的时间坐标（修正浪终点对应的 K 线时间）
    * @param price3 [in] 第3个锚点的价格坐标（修正浪终点价格）
    * @return bool - 操作结果：true 表示创建成功（对象创建+绑定完成），false 表示失败
    * @note 3个锚点需按时间顺序排列（time1 < time2 < time3），确保浪形结构符合艾略特修正浪逻辑
    */
   bool              Create(long chart_id,const string name,const int window,
                            const datetime time1,const double price1,
                            const datetime time2,const double price2,
                            const datetime time3,const double price3);

   //--- 对象类型标识（重写基类方法）
   /**
    * @brief 获取3浪修正浪对象类型（MQL5 预定义类型）
    * @return int - 对象类型标识（返回 OBJ_ELLIOTWAVE3，代表艾略特3浪修正浪）
    */
   virtual int       Type(void) const { return(OBJ_ELLIOTWAVE3); }

   //--- 序列化接口（重写基类方法，扩展波浪特有属性的读写）
   /**
    * @brief 将3浪修正浪参数（含特有属性）保存到文件
    * @param file_handle [in] 文件句柄（需提前以 FILE_WRITE 模式打开）
    * @return bool - 操作结果：true 表示保存成功，false 表示失败（文件无效/未绑定图表）
    * @note 保存内容：基类通用属性 + 浪级（Degree） + 连接线状态（Lines）
    */
   virtual bool      Save(const int file_handle);

   /**
    * @brief 从文件加载3浪修正浪参数（含特有属性）
    * @param file_handle [in] 文件句柄（需提前以 FILE_READ 模式打开）
    * @return bool - 操作结果：true 表示加载成功，false 表示失败（文件无效/未绑定图表）
    * @note 加载后覆盖浪级与连接线状态，需确保文件为 Save 方法生成的格式
    */
   virtual bool      Load(const int file_handle);
  };

//+------------------------------------------------------------------+
//| CChartObjectElliottWave5 类（艾略特5浪推动浪对象）                |
//| 功能：MQL5 图表艾略特5浪推动浪工具，用于标记价格趋势中的5浪推动结构 |
//| 继承关系：public CChartObjectElliottWave3（基于3浪修正浪类，扩展为5浪）|
//| 核心特性：                                                      |
//|  1. 5点定义结构：通过5个锚点确定完整5浪推动形态（1-2-3-4-5浪）      |
//|  2. 继承浪级与线条控制：复用父类的 Degree（浪级）和 Lines（连接线）属性 |
//|  3. 适配趋势分析：5浪结构为艾略特理论中的主要趋势形态（上升/下降趋势）|
//+------------------------------------------------------------------+
class CChartObjectElliottWave5 : public CChartObjectElliottWave3
  {
public:
   /**
    * @brief 构造函数：初始化艾略特5浪推动浪对象
    * @details 调用父类 CChartObjectElliottWave3 构造函数，继承浪级与线条控制属性
    */
                     CChartObjectElliottWave5(void);

   /**
    * @brief 析构函数：销毁艾略特5浪推动浪对象
    * @details 依赖父类析构逻辑，自动删除图表上的波浪对象，释放资源
    */
                    ~CChartObjectElliottWave5(void);

   //--- 5浪推动浪创建接口（扩展父类3浪创建方法，支持5个锚点）
   /**
    * @brief 在指定图表创建艾略特5浪推动浪对象（通过5个锚点定义）
    * @param chart_id [in] 目标图表 ID（0 表示当前图表）
    * @param name [in] 波浪对象唯一名称（图表内不可重复）
    * @param window [in] 子窗口编号（0=主窗口，≥1=指标子窗口）
    * @param time1 [in] 第1个锚点的时间坐标（1浪起点对应的 K 线时间）
    * @param price1 [in] 第1个锚点的价格坐标（1浪起点价格）
    * @param time2 [in] 第2个锚点的时间坐标（2浪调整点对应的 K 线时间）
    * @param price2 [in] 第2个锚点的价格坐标（2浪调整点价格）
    * @param time3 [in] 第3个锚点的时间坐标（3浪高点对应的 K 线时间，通常为最长浪）
    * @param price3 [in] 第3个锚点的价格坐标（3浪高点价格）
    * @param time4 [in] 第4个锚点的时间坐标（4浪调整点对应的 K 线时间）
    * @param price4 [in] 第4个锚点的价格坐标（4浪调整点价格）
    * @param time5 [in] 第5个锚点的时间坐标（5浪终点对应的 K 线时间）
    * @param price5 [in] 第5个锚点的价格坐标（5浪终点价格）
    * @return bool - 操作结果：true 表示创建成功（对象创建+绑定完成），false 表示失败
    * @note 5个锚点需按时间顺序排列（time1 < time2 < time3 < time4 < time5），符合艾略特推动浪的“5浪上升/下降”逻辑
    */
   bool              Create(long chart_id,const string name,const int window,
                            const datetime time1,const double price1,
                            const datetime time2,const double price2,
                            const datetime time3,const double price3,
                            const datetime time4,const double price4,
                            const datetime time5,const double price5);

   //--- 对象类型标识（重写父类方法，区分5浪与3浪类型）
   /**
    * @brief 获取5浪推动浪对象类型（MQL5 预定义类型）
    * @return int - 对象类型标识（返回 OBJ_ELLIOTWAVE5，代表艾略特5浪推动浪）
    */
   virtual int       Type(void) const { return(OBJ_ELLIOTWAVE5); }
  };
//+------------------------------------------------------------------+